﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Compilex.Automata
{
    /// <summary>
    /// Representa uma regra de transição. Define-se uma transição como a passagem
    /// de um estado para outro do autômato, dado que haja uma entrada. A entrada é
    /// modelada como um caractere.
    /// </summary>
    [Serializable]
    public class SimpleTransitionRule<S> : ITransitionRule<S>
    {
        public S Destination { get; set; }
        public string Input { get; set; }
        public virtual bool IsEpsilon { get { return false; } }

        public SimpleTransitionRule(char input, S destination)
        {
            this.Input = input.ToString();
            this.Destination = destination;
        }

        public SimpleTransitionRule(string input, S destination)
        {
            this.Input = input;
            this.Destination = destination;
        }

        /// <summary>
        /// Verifica se uma entrada corresponde a esta regra.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public virtual bool MatchesInput(string input)
        {
                return this.Input == input;
        }

        public override string ToString()
        {
            return String.Format("{0} -> {1}", Input, Destination.ToString());
        }
    }
}
